Datoteke - osnovne


Datoteke

1. podnaloga

Sestavite funkcijo prva_vrstica(ime_datoteke), ki vrne prvo vrstico datoteke z danim imenom.

Uradna rešitev

def prva_vrstica(ime_datoteke):
    '''Vrne prvo vrstico datoteke (brez znaka za prehod v novo vrsto)
       Če je datoteka prazna, kot rezultat vrnemo prazen niz
    '''
    dat = open(ime_datoteke)
    vrst = dat.readline()
    vrst = vrst.rstrip() # odstranimo znak za novo vrsto
    dat.close()
    return vrst

def prva_vrstica_V1(ime_datoteke):
    ''' Funkcija vrne prvo vrstico iz datoteke
        Če je datoteka prazna, kot rezulat vrnemo prazen niz
    '''
    dat = open(ime_datoteke, 'r')
    vrst = dat.readline()
    dat.close()
    return vrst[:-1] # odstranimo znak za novo vrsto

def prva_vrstica_V2(ime_datoteke):
    '''Vrne prvo vrstico datoteke (brez znaka za prehod v novio vrsto)
       Predpostavka: Datoteka ni prazna!
    '''
    # uporabimo nekaj drugačnih prijemov - razmisli o njih!
    with open(ime_datoteke) as f:
        return f.readlines()[0].rstrip()

2. podnaloga

Sestavite funkcijo stevilo_dolgih_vrstic(ime_datoteke, dolz), ki vrne število vseh vrstic v datoteki z danim imenom, ki so dolge vsaj dolz znakov (pri tem je dolz-ti lahko tudi znak "\n" za novo vrstico).

Uradna rešitev

def stevilo_dolgih_vrstic(ime_datoteke, dolz):
    '''vrne število vrstic v datoteki, ki so dolge vsaj dolz znakov
       Zraven štejemo tudi prehod v novoi vrsto'''
    kolikoJihJe = 0
    for vrs in open(ime_datoteke): # gremo po vseh vrsticah datoteke
        if len(vrs) >= dolz :
            kolikoJihJe += 1
    return kolikoJihJe

def stevilo_dolgih_vrstic_V1(ime_datoteke, dolz):
    '''vrne število vseh vrstic v datoteki,
       ki so dolge vsaj dolz znakov '''
    stVrstic = 0
    for vrstica in open(ime_datoteke, 'r'): # prečešemo vse vrstice v datoteki
        # ali so dovolj dolge
        if len(vrstica) >= dolz:
            stVrstic += 1
    return stVrstic

def stevilo_dolgih_vrstic_V2(ime_datoteke, dolz):
    '''vrne število vrstic v datoteki, ki so dolge vsaj dolz znakov
       Zraven štejemo tudi prehod v novo vrsto'''
    # uporabimo nekaj drugačnih prijemov - razmisli o njih!
    with open(ime_datoteke) as f:
        return len([vrs for vrs in f if len(vrs) >= dolz])

3. podnaloga

Sestavite funkcijo najdaljsa_vrstica(ime_datoteke), ki vrne najdaljšo vrstico v datoteki z danim imenom. Če je takih vrstic več, vrni zadnjo!

Uradna rešitev

def najdaljsa_vrstica(ime_datoteke):
    '''  vrne najdaljšo vrstico v datoteki z danim imenom. '''
    najdVrst = ''
    najDolz = 0
    for vrst in open(ime_datoteke):
        dolTrenutne = len(vrst)
        if dolTrenutne >= najDolz: #boljši kandidat! = ker hočemo zadnjo!
            najdVrst = vrst
            najDolz = dolTrenutne
    return najdVrst.rstrip()

def najdaljsa_vrstica_V2(ime_datoteke):
    '''  vrne najdaljšo vrstico v datoteki z danim imenom. '''
    # uporabimo nekaj drugačnih prijemov - razmisli o njih!
    with open(ime_datoteke) as f:
        _, max_vrs = max((len(vrs), vrs) for vrs in f)
        return max_vrs.rstrip()

Delo z vrsticami

1. podnaloga

Sestavi funkcijo prestejVrstice(datoteka), ki prešteje, koliko vrstic je na dani znakovni datoteki. Funkcija naj za parameter dobi ime datoteke.

Uradna rešitev

def prestejVrstice(datoteka):
    ''' koliko vrstic je na dani znakovni datoteki
        prepostavimo, da je datoteka dovolj kratka,
        da lahko vse njene vrstice shranimo v seznam '''
    f = open(datoteka,'r')
    stVrstic = len(f.readlines())
    f.close()
    return stVrstic

def prestejVrstice_V1(datoteka):
    ''' koliko vrstic je na dani znakovni datoteki'''
    # ta rešitev deluje, tudi, če je datoteka zelooooooo dolga
    stVrstic = 0
    for vrst in open(datoteka) : # preko vseh vrstic
        stVrstic += 1
    return stVrstic

2. podnaloga

Sestavi funkcijo vrniKVrstico(datoteka,k), ki vrne k-to vrstico dane znakovne datoteke. Vrednost k in ime datoteke naj funkcija dobi za parameter. V primeru ko datoteka ne vsebuje dovolj vrstic, naj vrne prazen niz.

Uradna rešitev

def vrniKVrstico(datoteka,k):
    ''' vrne k-to vrstico dane datoteke '''
    kolikoŠe = k # koliko vrstic je še potrebno prebrati
    f = open(datoteka,'r')
    while kolikoŠe > 0:
        vrstica = f.readline()
        if vrstica == '': # smo že čez konec datoteke, vrstic je premalo
            f.close() 
            return ''
        kolikoŠe -= 1 # ena manj za prebrati       
    f.close()
    return vrstica


def vrniKVrsticoV2(datoteka,k):
    ''' vrne k-to vrstico dane datoteke '''
    # če imamo dovolj prostora
    f = open(datoteka,'r')
    vrstice = f.readlines()
    f.close()
    if len(vrstice) >= k: # imamo dovolj vrstic
        return vrstice[k - 1]
    return ""

3. podnaloga

Na datoteki je pesem zapisana po kiticah. To pomeni, da so med kiticami prazne vrstice. Sestavi funkcijo odstraniPrazneVrstice(datotekaV, datotekaI), ki bo za dano ime datoteke datotekaV vse kitice združila in jih izpisala na datoteko2.

datotekaV:

Dekle je po vodo šlo
na visoke planine.

Vodo je zajemala,
je ribico zajela.

Ribica jo je prosila:
oj, pusti me živeti.

Dekle b'la je usmiljena,
je ribico spustila.

Ribica je zaplavala,
je dekle poškropila.
DatotekaI:
Dekle je po vodo šlo
na visoke planine.
Vodo je zajemala,
je ribico zajela.
Ribica jo je prosila:
oj, pusti me živeti.
Dekle b'la je usmiljena,
je ribico spustila.
Ribica je zaplavala,
je dekle poškropila.

Uradna rešitev

def odstraniPrazneVrstice(datotekaV, datotekaI):
    '''Izpiše datoteko brez praznih vrstic'''
    f = open(datotekaV,'r')
    izpis = open(datotekaI, 'w')
    while True:
        trenutnaVrstica = f.readline()
        if trenutnaVrstica not in ['\n', '\r\n']: # različni načini (glede na OS) oblike prazne vrstice
            print (trenutnaVrstica,end='',file=izpis)
        if trenutnaVrstica == '': # smo že čez konec datoteke
            f.close()
            izpis.close()
            return 

def odstraniPrazneVrstice_V1(datotekaV, datotekaI):
    '''Izpiše datoteko brez praznih vrstic'''
    izpis = open(datotekaI, 'w')
    for vrstica in open(datoteka):
        if vrstica != '\n' : # ni prazna
            print(vrstica, end='', file=izpis)
    izpis.close()

4. podnaloga

Direktor podjetja je dobil datoteko priporocilo.txt na kateri je pisalo: Spoštovani gospod direktor,

Janeza Novaka, mojega asistenta pri delu, vedno vidite, kako
trdo dela v svoji mali pisarni. Janez dela neodvisno in ne
lenari ali se pogovarja s sodelovci. Nikoli se ne zgodi, da bi
zavrnil kakšnega sodelovca, ki potrebuje pomoc. Do sedaj je vedno
koncal z delom pravocasno. Zelo pogosto si vzeme podaljšan
delovni cas, da konca svoje delo, pri cemer vcasih preskoci
odmor. Janez je takšen delavec, ko nima absolutno nobenega
spodrslajaja pri opravljenih delih, ima visoke dosežke in je širokega
znanja na njegovem podrocju. Moje mnenje je, da ga lahko takoj
uvrstimo med tiste najbolj vzorne delovce, ki jih nikoli ne
odpustimo. Prav tako vam vljudno predlagam, da je moj predlog
o napredovanju tega izjemnega, vzornega in nepogrešljivega delavca
izvršen kakor hitro je mogoce.

Lep pozdrav!

Že se je spravil pisati predlog za napredovanje, ko je po e-pošti prispel dopis:

Direktor!
Ta idiot je stal za menoj, ko sem pisal prejšnje priporocilo.
Prosim znova preberite vsako drugo vrstico tega pisma.

Direktor je sedaj povsem zmeden. Pomagaj mu in sestavi funkcijo izpisiDrugo(datotekaV, datotekaI), ki na datotekoI izpiše vsako drugo vrstico vsebine datoteke datotekaV!

Uradna rešitev

def izpisiDrugo(datotekaV, datotekaI):
    '''izpiše vsako drugo vrstico datoteke '''
    f = open(datotekaV)
    izp = open(datotekaI, 'w')
    vrstica = " " # zelimo zaceti pri prvi vrstici
    while vrstica != '' : # do konca datoteke
        vrstica = f.readline()
        # ta je liha, zato jo izpišemo
        print(vrstica, end= '', file = izp) # ker že vsebuje \n
        # naslednjo preskočimo
        vrstica = f.readline()
    f.close()
    izp.close()

def izpisiDrugoV1(datotekaV, datotekaI):
    '''izpiše vsako drugo vrstico datoteke '''
    stVrstice = 1
    izp = open(datotekaI, 'w')
    for vrstica in open(datoteka):
        if stVrstice % 2 == 1 : # vsako drugo preskočimo, začnemo s prvo
            print(vrstica, end= '', file = izp) # ker že vsebuje \n
        stVrstice += 1
    izp.close()
        
def izpisiDrugoV2(datoteka):
    ''' Če vemo, da je dovolj prostora, bomo uporabili kar readlines '''
    f = open(datoteka)
    vrstice = f.readlines()
    izp = open(datotekaI, 'w')
    # iz seznama vzamemo vsako drugo
    vrstice = vrstice[::2]
    for vrstica in vrstice: # Sedaj pa jih le še izpišemo
        print(vrstica, end= '', file = izp) # ker že vsebuje \n

def izpisiDrugoV3(datoteka):
    ''' In še malo bolj kompaktno '''
    for vrstica in open(datoteka).readlines()[0:-1:2]:
        print(vrstica, end= '', file = izp) # ker že vsebuje \n
    izp.close()

Arheologi

1. podnaloga

Arheologi: Arheologi so v jami blizu Gize našli čuden papirus. Besedilo na njem je bilo videti zelo čudno, a po drugi strani zelo podobno našemu. Dolgo so poskušali vse, da bi ga razvozlali. Na koncu se je oglasil 6 letni Mihec, sin glavnega arheologa: "Oci, zakaj si pa na ta papir pisal v napačno smer?" In res. Šlo je za povsem običajni tekst, le besedilo je bilo zapisano od desne proti levi. Ker pa je tako besedilo malček zoprno brati, pomagaj arheologom in sestavi funkcijo arheologi(datoteka), ki za dano ime datoteke sestavi novo datoteko z ravno obrnjenim imenom in enako koncnico (iz bla.txt torej naredi alb.txt, iz mojaDat.py pa taDajom.py). Ta nova datoteka naj vsebuje ravno obrnjene vrstice prvotne datoteke.

Uradna rešitev

import os.path

def arheologi(datoteka):
    '''sestavimo novo datoteko z ravno obrnjenim imenom in enako koncnico
       Ta nova datoteka vsebuje ravno obrnjene vrstice prvotne datoteke.'''
    #locimo koncnico datotek od imena
    ime, koncnica = os.path.splitext(datoteka)
    #ime datoteke obrnemo
    imeDat = ime[::-1]
    #ustvarimo novo datoteko z obrnjenim imenom
    novaDat = open(imeDat + koncnica,"w")
    for vrstica in open(datoteka,"r"):
        obVrstica = vrstica.rstrip()[::-1] # zraven se še znebimo zadnjega znaka 
        print(obVrstica, file = novaDat)
    novaDat.close()